
import ast


from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 注册节点模型, 节点模型匹配器


@注册节点模型(ast.Call)
class 调用ast节点基础模型定义(ast节点基础模型):
    """
    一个函数调用。 func 是函数，它通常是一个 Name 或 Attribute 对象。 对于其参数:

    args 保存由按位置传入的参数组成的列表。

    keywords 保存了一个代表以关键字传入的参数的 keyword 对象的列表。

    当创建 Call 节点时，需要有 args 和 keywords，但它们可以为空列表。
    """
    def 节点数据解析(self):
        self.参数名="类或函数名："
        if isinstance(self._ast节点.func, ast.Name):
            self.参数值=self._ast节点.func.id
        elif isinstance(self._ast节点.func, ast.Attribute):
            self.参数值=self._ast节点.func.attr
        else:
            self.参数值="未知"
        pass
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "执行节点", 节点位置=节点位置, 上级节点=上级节点)
        self.图形项 = 数据节点图形项(self)
        """
        args=[
        Name(id='a', ctx=Load()),
        Starred(  #变量引用
            value=Name(id='d', ctx=Load()),
            ctx=Load())],

        """

        #起始接口.添加接口到节点("调用流", "输入", 接口名称="执行对象", 必须连接=True)
        self.属性列表 = []

        self.函数名节点 = 节点模型匹配器(self._ast节点.func, self.所属节点模型管理器, 上级节点=self)
        结束接口 = self.添加接口到节点("调用流", "输入",接口名称="执行对象", 必须连接=False)
        起始接口 = self.函数名节点.添加接口到节点("调用流", "输出", 必须连接=False)
        起始接口.接口创建连接线模型(结束接口, self)

        位置=0
        # 先清空  再添加
        for 参数 in self._ast节点.args:

            # print("为调用节点添加参数连接")
            # print(参数)
            参数节点 = 节点模型匹配器(参数, self.所属节点模型管理器, 上级节点=self)
            # if isinstance(参数.value, ast.Starred):
            #     起始接口 = 起始接口.添加接口到节点("数据流", "输入", 接口名称="自解" + 命名参数.value.value.id,
            #                                    必须连接=False)
            结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="参数" + str(位置), 必须连接=False)

            起始接口 = 参数节点.添加接口到节点("数据流", "输出",必须连接=False)
            起始接口.接口创建连接线模型(结束接口, self)
            位置 += 1
        for 命名参数 in self._ast节点.keywords:
            """
            keywords=[
            keyword(
                arg='b',
                value=Name(id='c', ctx=Load())),
            keyword(
                value=Name(id='e', ctx=Load()))]))
                """
            命名参数节点 = 节点模型匹配器(命名参数.value, self.所属节点模型管理器, 上级节点=self)
            # 判断是否有arg属性
            if hasattr(命名参数, "arg"):
                起始接口 = self.添加接口到节点("数据流", "输入", 接口名称=命名参数.arg, 必须连接=False)
            elif isinstance(命名参数.value, ast.Name):
                起始接口 = self.添加接口到节点("数据流", "输入", 接口名称=命名参数.value.id, 必须连接=False)
            elif isinstance(命名参数.value, ast.Starred):
                起始接口 = self.添加接口到节点("数据流", "输入", 接口名称="自解" + 命名参数.value.value.id,
                                               必须连接=False)
            else:
                起始接口 = self.添加接口到节点("数据流", "输入", 接口名称="未知", 必须连接=False)
            结束接口 = 命名参数节点.添加接口到节点("数据流", "输出", 必须连接=False)
            起始接口.接口创建连接线模型(结束接口, self)


class 数据节点图形项(带布局的节点基础图形项):

    def __init__(self,节点定义, 父项=None):
        super().__init__( 节点定义, 父项)
        self.节点定义.节点介绍 ="函数调用节点介绍"
       # 起始接口.介绍文本.setPlainText()